package stage1.module2.Q1;

import java.util.Random;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        final int LOWER = 1;
        final int UPPER = 100;
        final int SIZE = 16;
        // final int SEED = 26;

        int[][] arr = getArr(SIZE, LOWER, UPPER);
        // int[][] arr = getArr(SIZE, SEED, LOWER, UPPER);
        printArr(arr);
        rowSum(arr);
        colSum(arr);
        diagonalSum(arr);
        diagonalSumInverse(arr);
    }

    /**
     * 生成一个包含随机数的2D数组
     * @param size 数组的大小
     * @param seed 用来产生随机数的种子
     * @param lower 随机数的下边界
     * @param upper 随机数的上边界
     * @return 符合要求的2D数组
     */
    public static int[][] getArr(int size, int seed, int lower, int upper) {
        // init an array
        int[][] arr = new int[size][size];

        // get rand object
        Random rand = new Random(seed);

        // fill in rand num
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                arr[i][j] = rand.nextInt(upper) + lower;
            }
        }
        return arr;
    }

    /**
     * 生成一个包含随机数的2D数组
     * @param size 数组的大小
     * @param lower 随机数的下边界
     * @param upper 随机数的上边界
     * @return 符合要求的2D数组
     */
    public static int[][] getArr(int size, int lower, int upper) {
        // 初始化一个数组
        int[][] arr = new int[size][size];

        // 拿到random对象
        Random rand = new Random();

        // 填充随机数
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                arr[i][j] = rand.nextInt(upper) + lower;
            }
        }
        return arr;
    }

    /**
     * 把输入的2D数组以排版好的方式打印出来，主要用于debug
     * @param arr 用于打印的数组
     */
    public static void printArr(int[][] arr) {
        System.out.println("Start printing the array");
        int size = arr.length;
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.printf("%3d ", arr[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }

    /**
     * 计算每行的和，并打印出来
     * @param arr 用来做计算的数组
     */
    public static void rowSum(int[][] arr) {
        int size = arr.length;
        System.out.println("Start printing row sum...");
        for (int i = 0; i < size; i++) {
            System.out.println("The sum for row " + (i + 1) + " is " + IntStream.of(arr[i]).sum());
        }
        System.out.println();
    }

    /**
     * 计算每列的和，并打印出来
     * @param arr 用来做计算的数组
     */
    public static void colSum(int[][] arr) {
        int size = arr.length;
        System.out.println("Start printing col sum...");
        for (int i = 0; i < size; i++) {
            int s = 0;
            for (int j = 0; j < size; j++) {
                s += arr[j][i];
            }
            System.out.println("The sum for col " + (i + 1) + " is " + s);
        }
        System.out.println();
    }

    /**
     * 计算左上角到右下角的所有元素的和，并打印出来
     * @param arr 用来做计算的数组
     */
    public static void diagonalSum(int[][] arr) {
        int size = arr.length;
        int s = 0;
        System.out.println("Start printing diagonal sum...");
        for (int i = 0; i < size; i++) {
            s += arr[i][i];
        }
        System.out.println("The sum from top left to bottom right is " + s);
        System.out.println();
    }

    /**
     * 计算左下角到右上角的所有元素的和，并打印出来
     * @param arr 用来做计算的数组
     */
    public static void diagonalSumInverse(int[][] arr) {
        int size = arr.length;
        int s = 0;
        System.out.println("Start printing inverse diagonal sum...");
        for (int i = 0; i < size; i++) {
            s += arr[i][size - 1 - i];
        }
        System.out.println("The sum from bottom left to top right is " + s);
        System.out.println();
    }
}
